`
https://leetcode.cn/problems/earliest-second-to-mark-indices-i/
`

/**
 * @param {number[]} nums
 * @param {number[]} changeIndices
 * @return {number}
 */
var earliestSecondToMarkIndices = function (nums, changeIndices) {
  const n = nums.length, m = changeIndices.length
  // 有位置不可能被标记
  if (Math.max(...changeIndices) < n) return -1

  // 第 t 秒能否完成全部标记
  // 索引有 1 位偏差
  const check = (t) => {
    // 记录每个位置的最晚出现时间
    const last = new Array(n).fill(-1)
    for (let i = 0; i < t; i++) {
      const changeIdx = changeIndices[i] - 1
      last[changeIdx] = i
    }
    // 有位置没办法标记
    if (last.includes(-1)) return false

    // 存储用来减少的秒
    let count = 0
    for (let i = 0; i < t; i++) {
      const changeIdx = changeIndices[i] - 1
      // 最后一次标记的机会
      if (i === last[changeIdx]) {
        // 尝试标记
        if (nums[changeIdx] > count) {
          // 标记不了，意味着没办法全部标记
          return false
        }
        count -= nums[changeIdx]
      } else {
        // 标记不了，留着
        count++
      }
    }
    return true
  }

  // 在把 nums 全部减成 0 并全部标记之前不可能完成
  let left = nums.reduce((acc, cur) => acc + cur) + n - 1
  let right = m + 1
  while (left + 1 < right) {
    const mid = left + Math.floor((right - left) / 2)
    if (check(mid)) {
      right = mid
    } else {
      left = mid
    }
  }
  return right > m ? -1 : right
};